Producing sophisticated software can involve many man-hours of software developers' effort to produce software code. To improve the understandability and maintainability of software code, software developers began using object-oriented programming techniques. Software code that was developed using object-oriented programming techniques generally encapsulated functionality into objects. As an example, when software accesses a database to store or retrieve data, the software may contain a database access object that other objects employ to access the database. Objects generally have attributes and methods. Attributes can store values. Other code in the software, such as other classes, can invoke the methods to manipulate the object's attributes or take various actions.
Objects can define complex data relationships. As an example, an object representing an address book can reference objects corresponding to multiple person objects, with each person object having an associated name, multiple addresses, multiple phone numbers, and so forth. The person object may include a method to return a preferred telephone number. The person object can be referenced as a single value in a variable. In contrast, a database can be defined using a database schema comprising tables and columns that is relational and so different from objects. Data can be stored in rows of each database table. Each row's data can comprise scalars, such as strings, integers, and so forth. No one column of a table contains the equivalent of a person object. Instead, the person object's attributes can be distributed among several columns, such as name, address, phone number, and so forth.
When developing a database access object, developers generally develop code to access the database. As an example, to store and retrieve address book entries, a developer may develop a database object that maps data from a person object's attributes to database column values and vice versa. However, every time the object's structure or the database schema changes, the code may need to be modified to conform to the change. The code would need to determine which tables and columns are needed to satisfy a particular database operation and produce corresponding database queries. This can involve substantial software development and testing effort.
Developers sometimes employ object relational mapping (ORM) techniques to simplify the understandability and maintainability of objects that access databases or, more generally, anytime two objects of different types exchange data. An object relational map identifies the mapping between two object types, such as a database object that accesses a database and the database itself. ORM techniques can be employed whenever transformation of data occurs from one complex type to another. ORM techniques map objects to database schemas to produce database queries automatically so that developers do not need to develop and maintain code for accessing databases. Using such techniques, a developer can map an object's attributes to database columns. ORM techniques produce suitable database access queries when an object accesses a corresponding database. However, developers and testers need to ascertain that the ORM techniques are producing correct database queries. In other words, developers need to know that an object relational map causes data that is stored to be equivalent to data that is retrieved. This is known in the art as a “round-trip” data analysis.